home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume10 / ien116-server < prev    next >
Encoding:
Internet Message Format  |  1987-07-29  |  16.6 KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v10i073:  IEN116 Nameserver
  5. Message-ID: <738@uunet.UU.NET>
  6. Date: 30 Jul 87 22:33:56 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 603
  9. Approved: rs@uunet.UU.NET
  10.  
  11. Submitted-by: mike@turing.unm.edu (Michael I. Bushnell)
  12. Posting-number: Volume 10, Issue 73
  13. Archive-name: ien116-server
  14.  
  15. [ This provides an old-style (non-domain) nameserver; Mike says it's
  16.   useful for Bridge terminal concentrators, but I wouldn't know.  I
  17.   once wrote something similar for the MIT PC/IP  package.  --r$  ]
  18.  
  19. #! /bin/sh
  20. # This is a shell archive, meaning:
  21. # 1. Remove everything above the #! /bin/sh line.
  22. # 2. Save the resulting text in a file.
  23. # 3. Execute the file with /bin/sh (not csh) to create the files:
  24. #    Makefile
  25. #    README
  26. #    driver.c
  27. #    nameserver.c
  28. #    nameserver.8
  29. export PATH; PATH=/bin:$PATH
  30. echo shar: extracting "'Makefile'" '(333 characters)'
  31. if test -f 'Makefile'
  32. then
  33.     echo shar: will not over-write existing file "'Makefile'"
  34. else
  35. sed 's/^X//' << \SHAR_EOF > 'Makefile'
  36. X# Makefile for the IEN116 datagram server.
  37. X
  38. X.SUFFIXES: .c,v
  39. XVPATH=RCS
  40. X
  41. XCFLAGS=-g
  42. XNOBJECTS=nameserver.o
  43. XDOBJECTS=driver.o
  44. X
  45. Xall: nameserver driver
  46. X
  47. Xnameserver: $(NOBJECTS)
  48. X    $(CC) $(CFLAGS) -o nameserver $(NOBJECTS)
  49. X
  50. Xdriver: $(DOBJECTS)
  51. X    $(CC) $(CFLAGS) -o driver $(DOBJECTS)
  52. X
  53. X.c,v.o:
  54. X    co -q $*.c
  55. X    $(CC) $(CFLAGS) -c $*.c
  56. X    rm -f $*.c
  57. X
  58. X
  59. SHAR_EOF
  60. if test 333 -ne "`wc -c < 'Makefile'`"
  61. then
  62.     echo shar: error transmitting "'Makefile'" '(should have been 333 characters)'
  63. fi
  64. fi # end of overwriting check
  65. echo shar: extracting "'README'" '(603 characters)'
  66. if test -f 'README'
  67. then
  68.     echo shar: will not over-write existing file "'README'"
  69. else
  70. sed 's/^X//' << \SHAR_EOF > 'README'
  71. X
  72. XThis program implements the IEN 116 nameserver protocol.  A driver is provided,
  73. Xbut it will ask for a machine probably not on your network, so it should be
  74. Xmodified.  This program is of use primarily for Bridge terminal servers, many
  75. Xof which use this protocol in requesting machine addresses.  For further
  76. Xinformation, see the document itself.
  77. X
  78. XTo compile, the command:
  79. X    % make
  80. Xis sufficient.  This will build the nameserver and the driver.
  81. X
  82. XIt is only known that this works on a 4.3BSD Vax, but it is likely that it 
  83. Xwill function on any compatable UNIX(*) machine.
  84. X
  85. X(*) UNIX is a trademark of AT&T.
  86. SHAR_EOF
  87. if test 603 -ne "`wc -c < 'README'`"
  88. then
  89.     echo shar: error transmitting "'README'" '(should have been 603 characters)'
  90. fi
  91. fi # end of overwriting check
  92. echo shar: extracting "'driver.c'" '(2605 characters)'
  93. if test -f 'driver.c'
  94. then
  95.     echo shar: will not over-write existing file "'driver.c'"
  96. else
  97. sed 's/^X//' << \SHAR_EOF > 'driver.c'
  98. X#ifndef lint
  99. X  static char *RCSid = "$Header: driver.c,v 1.5 87/06/24 15:02:38 mike Rel $";
  100. X#endif
  101. X
  102. X/* driver --
  103. X   drive the IEN 116 nameserver.
  104. X
  105. X   Written by Michael I. Bushnell.
  106. X   Copyright (c) 1987 Michael I. Bushnell
  107. X   You are hereby granted permission to use this program however you wish, 
  108. X   including copying and distribution.  However, you are obligated not to sell
  109. X   it or any part of it.  Anyone who obtains this program receives the right
  110. X   to do the same.  This statement may not be removed from this program.
  111. X*/
  112. X
  113. X/*
  114. X * $Source: /u1/staff/mike/src/nameserver/RCS/driver.c,v $
  115. X * $Revision: 1.5 $
  116. X * $Date: 87/06/24 15:02:38 $
  117. X * $State: Rel $
  118. X * $Author: mike $
  119. X * $Locker:  $
  120. X * $Log:    driver.c,v $
  121. X * Revision 1.5  87/06/24  15:02:38  mike
  122. X * Prepared for final release.  Added Copyright.
  123. X * 
  124. X * Revision 1.4  87/06/19  17:00:05  mike
  125. X * More toying around.
  126. X * 
  127. X * Revision 1.3  87/06/19  14:44:13  mike
  128. X * Toyed around.
  129. X * 
  130. X * Revision 1.2  87/06/15  13:50:51  mike
  131. X * Changed the host it asks for
  132. X * 
  133. X * Revision 1.1  87/06/12  13:42:29  mike
  134. X * Initial revision
  135. X * 
  136. X */
  137. X
  138. X#include <sys/types.h>
  139. X#include <sys/socket.h>
  140. X#include <netinet/in.h>
  141. X#include <stdio.h>
  142. X#include <netdb.h>
  143. X
  144. X#define PORT 5001
  145. X#define BUFLEN 256
  146. Xchar buf[BUFLEN];
  147. X
  148. X/* Driver for the IEN 116 nameserver */
  149. X
  150. Xmain()
  151. X{
  152. X  int sock;            /* Datagram socket */
  153. X  struct sockaddr_in from;    /* Where we got the reply from */
  154. X  struct sockaddr_in server;    /* Server's address */
  155. X  struct sockaddr_in ourname;    /* Our address */
  156. X  int addrlen;            /* Address length */
  157. X  int c,i;            /* Generic counters */
  158. X  
  159. X
  160. X  sock = socket(AF_INET, SOCK_DGRAM, 0);
  161. X  if (sock < 0)
  162. X    {
  163. X      perror("driver: opening socket");
  164. X      exit (1);
  165. X    }
  166. X  ourname.sin_family = AF_INET;
  167. X  ourname.sin_port = 0;
  168. X  ourname.sin_addr.s_addr = INADDR_ANY;
  169. X  if (bind(sock, (struct sockaddr *)&ourname, sizeof(ourname)))
  170. X    {
  171. X      perror("driver: binding socket");
  172. X      exit(1);
  173. X    }
  174. X  
  175. X  server.sin_family = AF_INET;
  176. X  server.sin_port = PORT;
  177. X  server.sin_addr.s_addr = INADDR_ANY;
  178. X
  179. X/* stick in whatever machine you want here */
  180. X  buf[0] = 1;            /* Code for request */
  181. X  buf[1] = 8;            /* Length of message */
  182. X  buf[2] = 'c';
  183. X  buf[3] = 'h';
  184. X  buf[4] = 'a';
  185. X  buf[5] = 'r';
  186. X  buf[6] = 'o';
  187. X  buf[7] = 'n';
  188. X
  189. X  if (sendto(sock, buf, 8, 0, (struct sockaddr *)&server, sizeof(server))==-1)
  190. X    {
  191. X      perror("driver: sending message");
  192. X      exit(1);
  193. X    }
  194. X
  195. X  if ((c=recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *)&from, sizeof(from)))==-1)
  196. X    {
  197. X      perror("driver: getting message");
  198. X      exit(1);
  199. X    }
  200. X
  201. X  for(i=0;i<c; ++i)
  202. X    putchar(buf[i]);
  203. X}
  204. SHAR_EOF
  205. if test 2605 -ne "`wc -c < 'driver.c'`"
  206. then
  207.     echo shar: error transmitting "'driver.c'" '(should have been 2605 characters)'
  208. fi
  209. fi # end of overwriting check
  210. echo shar: extracting "'nameserver.c'" '(9178 characters)'
  211. if test -f 'nameserver.c'
  212. then
  213.     echo shar: will not over-write existing file "'nameserver.c'"
  214. else
  215. sed 's/^X//' << \SHAR_EOF > 'nameserver.c'
  216. X#ifndef lint
  217. X  static char *RCSid = "$Header: nameserver.c,v 2.3 87/06/24 15:02:59 mike Rel $";
  218. X#endif
  219. X
  220. X/* nameserver --
  221. X   Use the IEN 116 protocol to respond to nameserver requests.
  222. X
  223. X   Written by Michael I. Bushnell.
  224. X   Copyright (c) 1987 Michael I. Bushnell
  225. X   You are hereby granted permission to use this program however you wish,
  226. X   including copying and distribution.  However, you are obligated not to sell
  227. X   it or any part of it.  Anyone who obtains this program receives the right
  228. X   to do the same.  This statement may not be removed from this program.
  229. X*/
  230. X
  231. X/*
  232. X * $Source: /u1/staff/mike/src/nameserver/RCS/nameserver.c,v $
  233. X * $Revision: 2.3 $
  234. X * $Date: 87/06/24 15:02:59 $
  235. X * $State: Rel $
  236. X * $Author: mike $
  237. X * $Locker:  $
  238. X * $Log:    nameserver.c,v $
  239. X * Revision 2.3  87/06/24  15:02:59  mike
  240. X * Final preparations for release.  Addeed Copyright.
  241. X * 
  242. X * Revision 2.2  87/06/24  14:54:29  mike
  243. X * de-lintified.  Lint, stupidly, doesn't pick up the definition of h_errno f
  244. X * from libc.a.  Sigh.  Prepared for release.
  245. X * 
  246. X * Revision 2.1  87/06/24  14:48:14  mike
  247. X * Better comments.
  248. X * 
  249. X * Revision 2.0  87/06/23  16:55:03  mike
  250. X * Split it up into different functions.
  251. X * 
  252. X * Revision 1.9  87/06/23  16:14:09  mike
  253. X * Added stuff to divorce process from shell and control terminal.
  254. X * 
  255. X * Revision 1.8  87/06/19  16:59:36  mike
  256. X * Uses syslog instead of perror.
  257. X * Lots of symbolic constants.
  258. X * 
  259. X * Revision 1.7  87/06/19  14:43:49  mike
  260. X * Fixed bug... need to initialize addrlen to sizeof(hisname).
  261. X * 
  262. X * Revision 1.6  87/06/16  16:08:04  mike
  263. X * Changed all "sizeof (hisaddr)" to "addrlen."
  264. X * Still a bug...the last sendto is returning EINVAL???
  265. X * 
  266. X * Revision 1.5  87/06/16  15:57:07  mike
  267. X * Actually...you need to return the raw bytes.  So I changed it back.
  268. X * Also added bookoo error checking.
  269. X * 
  270. X * Revision 1.4  87/06/15  13:50:22  mike
  271. X * Fixed bug...need to cast the argument of inet_ntoa into a struct in_addr.
  272. X * 
  273. X * Revision 1.3  87/06/08  14:16:56  mike
  274. X * Uses a PORT number instead of system chosen default...now its 5001.
  275. X * 
  276. X * Revision 1.2  87/06/08  14:10:33  mike
  277. X * Now it compiles.
  278. X * 
  279. X * Revision 1.1  87/06/08  13:42:20  mike
  280. X * Initial revision
  281. X * 
  282. X */
  283. X
  284. X#include <sys/file.h>
  285. X#include <sgtty.h>
  286. X
  287. X#include <signal.h>
  288. X#include <syslog.h>
  289. X
  290. X#include <sys/types.h>
  291. X#include <sys/socket.h>
  292. X#include <netinet/in.h>
  293. X#include <netdb.h>
  294. X
  295. X#include <stdio.h>
  296. X
  297. X/* Generic constants */
  298. X#define PORT 5001        /* Port for the server */
  299. X#define BUFLEN 256        /* Length of input buffer */
  300. X#define DEF_PROTO 0        /* Use default protocol */
  301. X#define NO_FLAGS 0        /* No flags on recvfrom/sendto */
  302. X
  303. X/* Message lengths */
  304. X#define RET_MSG_LEN 6        /* Length of what we add to buf */
  305. X#define ERR_MSG_LEN 3        /* Length of error messages */
  306. X
  307. X/* Message types from IEN 116 */
  308. X#define ADDR_REQ 1        /* Address Request */
  309. X#define ADDR_ANS 2        /* Address Request Answer */
  310. X#define ERR      3        /* Error */
  311. X
  312. X/* Error types from IEN 116 */
  313. X#define UNK_ERR  0        /* Unknown Error */
  314. X#define HOST_UNK 1        /* Host Unknown */
  315. X#define SYNT_ERR 2        /* Syntax Error */
  316. X
  317. Xchar buf[BUFLEN];        /* Input/Output buffer */
  318. Xextern int errno, h_errno;
  319. Xextern char *sys_errlist[];
  320. X
  321. Xmain()
  322. X{
  323. X  int sock;            /* Datagram socket */
  324. X  struct sockaddr_in hisname;    /* Address of requestor */
  325. X  int addrlen;            /* Length of his address */
  326. X  struct hostent *hp, *gethostbyname();    /* Host inquired of */
  327. X  char *name;            /* Name of the machine requested */
  328. X  int msglen;            /* Length of the message received */
  329. X  char *nameloc();
  330. X
  331. X  setupsig();            /* Set up signal handling */
  332. X  setuplog();            /* Set up the syslog connection */
  333. X  divorce();            /* Divorce ourselves from terminal and shell */
  334. X  sock = makesocket();        /* make and bind the socket */
  335. X  addrlen = sizeof(hisname);    
  336. X
  337. X  /* Main loop */
  338. X restart:
  339. X  while (1)
  340. X    {
  341. X      /* Read a message */
  342. X      msglen = recvfrom(sock, buf, BUFLEN - RET_MSG_LEN,
  343. X            NO_FLAGS, (struct sockaddr *)&hisname, &addrlen);
  344. X      if (msglen == -1)
  345. X    {
  346. X      syslog(LOG_ERR, "Error on incoming message: %s\n", 
  347. X         sys_errlist[errno]);
  348. X      goto restart;
  349. X    }
  350. X
  351. X      /* Find the name */
  352. X      name = nameloc(buf, BUFLEN, msglen, &hisname, addrlen, sock);
  353. X      if ((int) name == -1) 
  354. X    goto restart;
  355. X
  356. X
  357. X      /* Get the host entry */
  358. X      if ((hp = gethostbyname(name))== NULL)
  359. X    {
  360. X      /* Send error message */
  361. X      buf[msglen] = ERR;    
  362. X      buf[msglen+1] = ERR_MSG_LEN;
  363. X      if (h_errno == HOST_NOT_FOUND ||
  364. X          h_errno == TRY_AGAIN ||
  365. X          h_errno == NO_ADDRESS) 
  366. X        buf[msglen+2] = HOST_UNK; 
  367. X      else
  368. X        buf[msglen+2] = UNK_ERR; 
  369. X      if (sendto(sock, buf, msglen+ERR_MSG_LEN, NO_FLAGS, 
  370. X             (struct sockaddr *)&hisname, addrlen)==-1)
  371. X        {
  372. X          syslog(LOG_ERR, "Error sending error 3: %s\n", sys_errlist[errno]);
  373. X          goto restart;
  374. X        }  
  375. X    }
  376. X      else
  377. X    {
  378. X      /* Send the reply */
  379. X      buf[msglen] = ADDR_ANS;
  380. X      buf[msglen+1] = RET_MSG_LEN;
  381. X      buf[msglen+2] = hp->h_addr_list[0][0];
  382. X      buf[msglen+3] = hp->h_addr_list[0][1];
  383. X      buf[msglen+4] = hp->h_addr_list[0][2];
  384. X      buf[msglen+5] = hp->h_addr_list[0][3];
  385. X
  386. X      if (sendto(sock, buf, msglen+RET_MSG_LEN, NO_FLAGS, 
  387. X             (struct sockaddr *)&hisname, addrlen)==-1)
  388. X        {
  389. X          syslog(LOG_ERR, "Error sending reply: %s\n", sys_errlist[errno]);
  390. X          goto restart;
  391. X        }
  392. X    }
  393. X    }
  394. X}
  395. X
  396. X
  397. X/* setupsig -- Set all signals to be ignored.  Those which cannot be ignored
  398. X   will be left at the default. */
  399. Xsetupsig()
  400. X{
  401. X  int i;            /* Index of signals */
  402. X  
  403. X  for (i=0; i < NSIG; ++i)
  404. X    (void) signal(i, SIG_IGN);
  405. X}
  406. X  
  407. X
  408. X/* setuplog -- set up the syslog connection */
  409. Xsetuplog()
  410. X{
  411. X  openlog("nameserver", LOG_PID | LOG_CONS, LOG_DAEMON);
  412. X}
  413. X
  414. X
  415. X/* divorce -- Divorce ourselves from the terminal and the shell */
  416. Xdivorce()
  417. X{
  418. X  int term;            /* Terminal filed */
  419. X
  420. X  /* First the shell */
  421. X  switch(fork()) 
  422. X    {
  423. X    case -1:
  424. X      syslog(LOG_CRIT, "Cannot fork: %s\n", sys_errlist[errno]);
  425. X      exit(1);
  426. X      break;
  427. X    case 0:
  428. X      break;
  429. X    default:
  430. X      exit(0);
  431. X      break;
  432. X    }
  433. X
  434. X  /* Now the files */
  435. X  /* POTENTIAL BUG-- ASSUMES THAT THE TERMINAL IS ONLY OPEN ON FILEDS 0,1,2 */
  436. X  (void) close (0);
  437. X  (void) close (1);
  438. X  (void) close (2);
  439. X  /* Now the terminal */
  440. X  if ((term = open("/dev/tty", O_RDWR, 0)) == -1)
  441. X    {
  442. X      syslog(LOG_CRIT, "Cannot open /dev/tty: %s\n", sys_errlist[errno]);
  443. X      exit(1);
  444. X    }
  445. X  if (ioctl(term, TIOCNOTTY, (char *) 0) == -1)
  446. X    {
  447. X      syslog(LOG_CRIT, "Cannot divorce from control terminal: %s\n", 
  448. X         sys_errlist[errno]);
  449. X      exit(1);
  450. X    }
  451. X  (void) close(term);
  452. X}
  453. X
  454. X
  455. X/* makesocket -- return the filed of a new bound socket */
  456. Xmakesocket()
  457. X{
  458. X  int sock;            /* Socket */
  459. X  struct sockaddr_in ourname;    /* Our name */
  460. X
  461. X  /* create the socket */
  462. X  sock = socket(AF_INET, SOCK_DGRAM, DEF_PROTO);
  463. X  if (sock < 0)
  464. X    {
  465. X      syslog(LOG_CRIT, "Error opening socket: %s\n", sys_errlist[errno]);
  466. X      exit(1);
  467. X    }
  468. X  ourname.sin_family = AF_INET;
  469. X  ourname.sin_port = PORT;
  470. X  ourname.sin_addr.s_addr = INADDR_ANY;
  471. X  if (bind(sock, &ourname, sizeof(ourname)))
  472. X
  473. X    {
  474. X      syslog(LOG_CRIT, "Error binding socket: %s\n", sys_errlist[errno]);
  475. X      exit(1);
  476. X    }
  477. X  return sock;
  478. X}  
  479. X
  480. X
  481. X/* nameloc -- return the address of a null-terminated string which is the
  482. X   name to be looked up.  Report syntax errors to reportto through sock.
  483. X   If an error occurs, return (char *) -1.  If an error occurs, buf will be 
  484. X   changed. */
  485. Xchar *
  486. Xnameloc(buf, buflen, msglen, reportto, addrlen, sock)
  487. X     char *buf;            /* Buffer holding the request */
  488. X     int buflen,        /* Length of the buffer */
  489. X       msglen,            /* Length of the message in the buffer */
  490. X       sock,            /* Socket for error replies */
  491. X       addrlen;            /* Length of reportto */
  492. X     struct sockaddr_in *reportto; /* Who we report errors to */
  493. X{
  494. X  char *name;            /* Address of the name */
  495. X  int code;            /* Type of request */
  496. X
  497. X  buf[msglen] = '\0';
  498. X  /* Check type */      
  499. X  code = buf[0];
  500. X  if (code != ADDR_REQ)
  501. X    if (code !=ADDR_ANS && code !=ERR)
  502. X      {
  503. X    /* Send error message */
  504. X    buf[0] = ERR;    
  505. X    buf[1] = ERR_MSG_LEN;
  506. X    buf[2] = SYNT_ERR;
  507. X    if (sendto(sock, buf, ERR_MSG_LEN, NO_FLAGS, 
  508. X           (struct sockaddr *)&reportto, addrlen)==-1)
  509. X      {
  510. X        syslog(LOG_ERR, "Error sending error 0: %s\n", sys_errlist[errno]);
  511. X        return (char *) -1;
  512. X      }        
  513. X      }
  514. X    else
  515. X      return (char *) -1;
  516. X  
  517. X  /* Put name at the start of a null-terminated string */
  518. X  if (buf[2]!='!')
  519. X    name=buf+2;
  520. X  else
  521. X    {
  522. X      for(name=buf+2; *name!='!'; ++name)
  523. X    if (name-buf >= buflen)
  524. X      {            
  525. X        /* Send error packet */
  526. X        buf[0] = ERR;
  527. X        buf[1] = ERR_MSG_LEN;
  528. X        buf[2] = SYNT_ERR;
  529. X        if (sendto(sock, buf, ERR_MSG_LEN, NO_FLAGS, 
  530. X               (struct sockaddr *)&reportto, addrlen)==-1)
  531. X          {
  532. X        syslog(LOG_ERR, "Error sending error 1: %s\n", 
  533. X               sys_errlist[errno]);
  534. X        return (char *) -1;
  535. X          }
  536. X      }
  537. X      for(++name; *name!='!'; ++name)
  538. X    if (name-buf >= buflen)
  539. X      {            
  540. X        /* Send error packet */
  541. X        buf[0] = ERR;
  542. X        buf[1] = ERR_MSG_LEN;
  543. X        buf[2] = SYNT_ERR;
  544. X        if (sendto(sock, buf, ERR_MSG_LEN, NO_FLAGS, 
  545. X               (struct sockaddr *)&reportto, addrlen)==-1)
  546. X          {
  547. X        syslog(LOG_ERR, "Error sending error 2: %s\n", 
  548. X               sys_errlist[errno]);
  549. X        return (char *) -1;
  550. X          }
  551. X      }
  552. X      ++name;
  553. X    }
  554. X  return name;
  555. X}
  556. X
  557. X
  558. X
  559. SHAR_EOF
  560. if test 9178 -ne "`wc -c < 'nameserver.c'`"
  561. then
  562.     echo shar: error transmitting "'nameserver.c'" '(should have been 9178 characters)'
  563. fi
  564. fi # end of overwriting check
  565. echo shar: extracting "'nameserver.8'" '(702 characters)'
  566. if test -f 'nameserver.8'
  567. then
  568.     echo shar: will not over-write existing file "'nameserver.8'"
  569. else
  570. sed 's/^X//' << \SHAR_EOF > 'nameserver.8'
  571. X.TH nameserver 8 "Local \- June 24, 1987" "M. I. Bushnell"
  572. X.SH NAME
  573. Xnameserver \- process IEN 116 requests
  574. X.SH SYNOPSIS
  575. X.B nameserver
  576. X.SH DESCRIPTION
  577. X\fBNameserver\fR processes requests for network addresses using the IEN 116
  578. Xprotocol.
  579. X.SH SEE ALSO
  580. XIEN 116 \- Internet Name Server (J. Postel)
  581. X.SH DIAGNOSTICS
  582. XVarious messages logged by syslog using LOG_CRIT and LOG_ERR.
  583. XMainly self-explanatory.  Errors such as
  584. X.RS .5i
  585. XError sending error \fIn\fR: ....
  586. X.RE
  587. Xrefer to errors in the transmission of error messages back to the requestor.
  588. XFor explanation of the numbers, see the source.
  589. X.SH BUGS
  590. XWill not properly detach from the terminal if the terminal is opened on
  591. Xany descriptor other than 0, 1, or 2.
  592. SHAR_EOF
  593. if test 702 -ne "`wc -c < 'nameserver.8'`"
  594. then
  595.     echo shar: error transmitting "'nameserver.8'" '(should have been 702 characters)'
  596. fi
  597. fi # end of overwriting check
  598. #    End of shell archive
  599. exit 0
  600.                     Michael I. Bushnell
  601.                     a/k/a Bach II
  602.                     mike@turing.UNM.EDU
  603. ---
  604. Somewhere in Tenafly, New Jersey, a chiropractor is viewing
  605.  ``Leave it to Beaver''!
  606.                 -- Zippy the Pinhead
  607.  
  608. -- 
  609.  
  610. Rich $alz            "Anger is an energy"
  611. Cronus Project, BBN Labs    rsalz@bbn.com
  612. Moderator, comp.sources.unix    sources@uunet.uu.net
  613.